/* 
 * File:   XMLParser.h
 * Author: Gab'z
 *
 * Created on 14 juin 2012, 19:18
 */

#ifndef XMLPARSER_H
#define	XMLPARSER_H

#include <QtXml>
#include <string>
#include <qdom.h>
#include "../log/LogSystem.h"
#include "../model/Context.h"
#include "../model/parameters/Parameters.h"
#include "../model/command/Command.h"
#include "../model/command/literal/Stack.h"
#include "../model/command/literal/Constant.h"
#include "../model/command/literal/Expression.h"
#include "../controler/CalculatorParser.h"

namespace calculator {

    /**
     * Parseur XML/CalculatriceNPI.
     * Design Pattern Singleton.
     */
    class XMLParser {
    public:

        /**
         * Singleton XMLParser.
         * @return crée et/ou renvoie l'unique instance de XMLParser.
         */
        static XMLParser* getInstance();

        /**
         * Singleton XMLParser.
         * Détruit l'unique instance de XMLParser. 
         */
        static void deleteInstance();

        /**
         * Méthode de chargement du Context à partir d'un fichier XML.
         * @param context le context à modifier.
         * @param saveFilename le nom du fichier à charger.
         */
        void loadContextFromFile(Context* context, const std::string& saveFilename);

        /**
         * Méthode d'enregistrement du Context vers un fichier XML.
         * @param context le context à sauvegarder.
         * @param saveFilename le nom du fichier vers lequel sauvegarder.
         */
        void saveContextToFile(const Context * const context, const std::string& saveFilename);



    private:

        /**
         * Constructeur de XMLParser
         * @param context le context courant dont on utilise 
         * le parseur pour transformer du texte en Command.
         */
        XMLParser(Context * const context);

        /**
         * Destructeur de XMLParser
         * Ne détruit rien d'autre que lui-même
         */
        virtual ~XMLParser();

        /**
         * Crée un noeud XML à partir des Parameters.
         * @param dom le document XML auquel on ajoute le noeud.
         * @param parameters les paramètres à sauvergarder.
         * @return un noeud XML contenant les paramètres.
         */
        QDomElement parametersToNode(QDomDocument& dom, const Parameters * const parameters) const;

        /**
         * Crée un noeud XML à partir de la StackList.
         * @param dom le document XML auquel on ajoute le noeud.
         * @param stacklist la StackList à sauvergarder.
         * @return un noeud XML contenant l'index de la Stack courante du Context.
         */
        QDomElement stacklistToNode(QDomDocument& dom, const StackList * const stacklist) const;

        /**
         * Crée un noeud XML à partir d'une Stack.
         * @param dom le document XML auquel on ajoute le noeud.
         * @param stack la stack à sauvergarder.
         * @return un noeud XML contenant un noeud XML par Constant de la Stack.
         */
        QDomElement stackToNode(QDomDocument& dom, const Stack * const stack) const;

        /**
         * Crée un noeud XML à partir d'une Constant.
         * @param dom le document XML auquel on ajoute le noeud.
         * @param constant la Constant à sauvergarder.
         * @return un noeud XML contenant les paramètres.
         */
        QDomElement constantToNode(QDomDocument& dom, const Constant * const constant) const;

        /**
         * Crée un objet Parameters à partir des informations lues dans le noeud XML.
         * @param domElement un noeud où se touvent les informations sur les paramètres.
         * @return un objet Parameters.
         */
        Parameters* NodeToParameters(QDomElement& domElement) const;

        /**
         * Crée un objet Constant à partir d'un noeud XML.
         * @param domElement un noeud contenant une Constant.
         * @return un objet Constant.
         */
        const Constant* NodeToConstant(QDomElement& domElement) const;

        /**
         * instance du Singleton XMLParser.
         */
        static XMLParser* instance;

        /**
         * Pointeur vers le CalculatorParser du Context.
         */
        CalculatorParser* calculatorParser;
        static Logger* log;
    };
}
#endif	/* XMLPARSER_H */

